//
//  LoloaageIMProtocolPublic.h
//  2bulu-IM
//
//  Created by 罗亮富 on 14-4-25.
//  Copyright (c) 2014年 Lolaage. All rights reserved.
//

///#warning exist use new

#ifndef _bulu_IM_LoloaageIMProtocolPublic_h
#define _bulu_IM_LoloaageIMProtocolPublic_h

#import <FoundationUtilities/LAGTypes.h>
#import <Foundation/Foundation.h>


#define PROTOCOL_VERSION    38

//#define PROTOCOL_ENCODE     1 //1：UTF-8 2：GBK
#define PROTOCOL_ENCRYPT    0 //

typedef char EDIAN_T;
#define L_ED  2 //little edian
#define H_ED  1 //big edian

typedef enum {
    STREAM_CLIENT_REQUEST = 1,
    STREAM_SEVER_RESPONSE = 2,
    STREAM_SEVER_PUSH     = 3,
    STREAM_CLIENT_RESPONSE = 4
}STREAM_TYPE;

#pragma pack(1)
//连续存储空间的字符串，最前面是一个2字节的长度指示
typedef struct {
    U16 length;
    S8  firstChar; //第一个字符
} String;

//协议号结构
typedef struct {
    U8 main; //asscii 主协议号
    U8 sub;  //decimal <256 次协议号
}ProtocolCommand;

typedef struct
{
    U8  version;      // 协议版本
    U8  endian;                // 字节序
    U8  header_len;            // 包头长度
    ProtocolCommand cmd;        //文档中所说的协议号
    U8  session[16];            // 会话ID
    S16 index;                  // 会话序列号
    S16 packet_len;            // 包总长度
    U8  terminal_type;         // 发送端类型
    U8  stream_type;           // 1-终端请求，2-服务器对请求的响应,3-服务端推送，4-终端对推送的响应
    U8  encrypt_type;          // 包加密类型
} ProtocolHeader;


typedef struct
{
    S32 errorCode; //错误代码
    String errorMsg; //只有在错误代码为非0的情况下才有
}ProtocolResponsePublic;
#pragma pack()

#define HEADER_LENGTH sizeof(ProtocolHeader) // 28 //注意若未声明字节对齐则不能用sizeof(),因为sizeof还涉及到内存对齐问题，出错的可能性很大



#define USER_ID_NULL 0

#define PROTOCOL_END_TYPE   3 //表示ios

#ifdef EXPLORE_DISTR
#define END_PRODUCT PRODUCT_TYPE_OUTDOOR_ASSISTANT_EXPLORE
#else
#define END_PRODUCT PRODUCT_TYPE_OUTDOOR_ASSISTANT
#endif

#define END_PLAT_IOS [NSString stringWithFormat:@"%d",PROTOCOL_END_TYPE]



NSString *nsstringFromString(String *string);

//返回的NSData就是一个封装好了的String
NSData *stringDataFromNsstring(NSString *objstr);

#endif
